<!DOCTYPE html>
<html lang="en">
  <head>
    <meta charset="UTF-8" />
    <meta http-equiv="X-UA-Compatible" content="IE=edge" />
    <meta name="viewport" content="width=device-width, initial-scale=1.0" />
    <title>3.回调ref中回调执行次数</title>
    <!-- 引入react核心库 -->
    <script src="../React-js/react.development.js"></script>
    <!-- 引入react-dom,用于支持react操作DOM -->
    <script
      type="text/javascript"
      src="../React-js/react-dom.development.js"
    ></script>
    <!-- 引入babel,用于将jsx转换为js -->
    <script type="text/javascript" src="../React-js/babel.min.js"></script>

    <style>
      * {
        margin: 0;
        padding: 0;
        box-sizing: border-box;
      }
      body {
        display: flex;
        justify-content: center;
        align-items: center;
        min-height: 100vh;
        background-color: #303030;
      }
      .demo {
        display: flex;
        flex-direction: column;
        gap: 20px;
      }
      .weather {
        display: flex;
        gap: 30px;
      }
      input {
        border: none;
        outline: none;
        padding: 15px;
        font-size: 18px;
        border-radius: 5px;
        margin-right: 30px;
      }
      button {
        padding: 10px;
        border-radius: 10px;
        font-size: 18px;
        cursor: pointer;
      }
      button:active {
        transform: scale(0.98);
      }
    </style>
  </head>
  <body>
    <!-- 
关于回调 refs 的说明:
  如果 ref 回调函数是以内联函数的方式定义的，在更新过程中它会被执行两次，
  1.第一次传入参数 null，2.然后第二次会传入参数 DOM 元素。
  这是因为在每次渲染时会创建一个新的函数实例，所以 React 清空旧的 ref 并且设置新的。
  通过将 ref 的回调函数定义成 class 的绑定函数的方式可以避免上述问题，
  但是大多数情况下它是无关紧要的。
     -->
    <!-- 准备好一个“容器” -->
    <div id="test"></div>
    <script type="text/babel">
      // 1.创建组件
      class MyComponent extends React.Component {
        state = { isHot: true };
        // 点击切换天气
        weatherChange = () => {
          const { isHot } = this.state;
          this.setState({ isHot: !isHot });
        };
        // 点我提示输入数据
        showData = () => {
          const { inputEl } = this;
          alert(inputEl.value);
        };
        textInput = (currentNode) => {
          this.inputEl = currentNode;
          console.log('@', currentNode);
        };

        render() {
          // console.log(this);
          const { isHot } = this.state;

          return (
            <div className="demo">
              <div>
                {
                  // <input
                  //   ref={(currentNode) => {
                  //     this.inputEl = currentNode;
                  //     console.log('@', currentNode);
                  //   }}
                  //   type="text"
                  //   placeholder="点击按钮提示数据"
                  // />
                }
                <input
                  ref={this.textInput}
                  type="text"
                  placeholder="点击按钮提示数据"
                />
                <button onClick={this.showData}>点我提示输入数据</button>
              </div>

              <div className="weather">
                <h2>今天天气很{isHot ? '炎热' : '寒冷'}</h2>
                <button onClick={this.weatherChange}>点我切换天气</button>
              </div>
            </div>
          );
        }
      }
      // 2.渲染组件到页面
      ReactDOM.render(<MyComponent />, document.getElementById('test'));
    </script>
  </body>
</html>
